/*
 * PROJECT NAME: platform_dymcform_display
 * PACKAGE NAME: com.jodinfo.outmirror.api.tabledefine.service
 * FILE    NAME: DymcformBizServiceImpl.java
 * COPYRIGHT: Copyright(c) © 2016 JodInfo Company Ltd. All Rights Reserved
 */ 
package com.jodinfo.outmirror.api.tabledefine.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.util.Base64;
import com.hero.common.web.context.UserContext;
import com.hero.core.constant.SysConstant;
import com.hero.core.constant.SysSqlConstant;
import com.hero.core.entity.IPlatformUser;
import com.hero.core.entity.PageResult;
import com.hero.core.entity.ResponseEntity;
import com.hero.core.exception.BusinessException;
import com.hero.core.util.CodeFilter;
import com.hero.core.util.DateUtils;
import com.hero.core.util.IdWorker;
import com.jodinfo.outmirror.api.Dymcform.service.DymcformDmlService;
import com.jodinfo.outmirror.api.Dymcform.service.DymcformQueryService;
import com.jodinfo.outmirror.api.columndefine.entity.ColumnDefineEntity;
import com.jodinfo.outmirror.api.columndefine.service.ColumnDefineQueryService;
import com.jodinfo.outmirror.api.tabledefine.entity.SubtableDTO;
import com.jodinfo.outmirror.api.tabledefine.entity.TableDefineEntity;

/**
 * 动态表单操作类
 * @author shensu
 * @date 2017年4月5日 上午9:23:35
 * @version <b>1.0.0</b>
 */
@Service(value="dymcformBizService")
public class DymcformBizServiceImpl implements DymcformBizService {
    private static final Logger logger = LoggerFactory.getLogger(DymcformBizServiceImpl.class);
	@Resource(name="columnDefineQueryService")
	ColumnDefineQueryService columnDefineQueryService;
	@Resource(name="dymcformQueryService")
	DymcformQueryService dymcformQueryService;
	@Resource(name="dymcformDmlService")
	DymcformDmlService dymcformDmlService;
	@Resource(name="tableDefineQueryService")
	TableDefineQueryService tableDefineQueryService;
	
	/** 
	 * 
	 * @author shensu
	 * @date 2017年4月5日 上午9:23:35
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#saveFormData(com.jodinfo.outmirror.api.tabledefine.entity.TableDefineEntity)
	 * @param tableDefineEntity
	 * @return
	 */
	public ResponseEntity saveFormData(TableDefineEntity tableDefineEntity) {
		ResponseEntity rs = new ResponseEntity(SysConstant.SUCCESS,"操作成功");
		List<ColumnDefineEntity> list = queryExistcolumnDefine(tableDefineEntity.getDymcformId());
		Set<String > set = new HashSet<String>();
		queryIsListColumnDefine(list,set,tableDefineEntity);
		Map<String,Object> result = new HashMap<String,Object>();
		List<String> crudSqls = new ArrayList<String>();
		concatCrudSql(tableDefineEntity,list,set,crudSqls,result);
		dymcformDmlService.batchExecuteSqls(crudSqls);
		rs.setResult(result);
		return rs;
	}

	/**
	 * 查询列是子表属性
	 * @author cao.weiwei
	 * @date 2017年4月22日 下午3:41:04
	 * @param list
	 * @param listColumnNames
	 * @param tableDefineEntity
	 */
	private void queryIsListColumnDefine(List<ColumnDefineEntity> list,
			Set<String> listColumnNames,TableDefineEntity tableDefineEntity) {
		for(ColumnDefineEntity column: list){
			if(SysConstant.SUCCESS.equals(column.getIsList())){
				listColumnNames.add(column.getColumnName());
			}
		}
		
	}

	/**
	 * 拼接crudSql
	 * @author cao.weiwei
	 * @date 2017年4月10日 下午4:04:14
	 * @param tableDefineEntity
	 * @param list
	 * @param set 是子表控件的列
	 * @param sqls
	 */
	private void concatCrudSql(TableDefineEntity tableDefineEntity,List<ColumnDefineEntity> list,
			Set<String > set,List<String> sqls,Map<String,Object> result ) {
		String jsonStr = tableDefineEntity.getHtmlValue();
		StringBuffer crudSql = new StringBuffer();
		JSONObject jsonObj = JSON.parseObject(jsonStr);
		
		String id = jsonObj.getString(SysSqlConstant.ID.trim());
		//String subTableData = jsonObj.getString(TableDefineConstant.SUBTABLELIST.trim());// 子表数据
		if(StringUtils.isNotBlank(id)){
			result.put("id", id);
			String version = jsonObj.getString(SysSqlConstant.VERSION.trim().toLowerCase());
			if(!validateVersion(tableDefineEntity,id,version)) throw new BusinessException("0", "版本号不一致");
			
			concateUpdateSql(tableDefineEntity, list,crudSql, jsonObj, id, result);
			sqls.add(crudSql.toString());
			if(!CollectionUtils.isEmpty(set)){
				sqls.addAll(scanUpdateSubtable(tableDefineEntity,list,set,jsonObj,id));
			}
			//TODO 自定义控件数据更新入库
		}else{
			concateInsertSql(tableDefineEntity, list, crudSql, jsonObj,result);
			sqls.add(crudSql.toString());
			if(!CollectionUtils.isEmpty(set)){
				sqls.addAll(scanInsertSubtable(tableDefineEntity,list,set,jsonObj,result.get("id").toString()));
			}
			//TODO 自定义控件数据更新入库
		}
	}
	/**
	 * 验证版本
	 * @author cao.weiwei
	 * @date 2017年4月20日 下午7:26:22
	 * @param tableDefineEntity
	 * @param 主表id
	 * @param version
	 * @return
	 */
	private boolean validateVersion(TableDefineEntity tableDefineEntity,
			String id, String version) {
		String sql = "select version from "+tableDefineEntity.getTableName()+"  where id='"+id+"'";
		Map<String,Object> map = dymcformQueryService.queryDymcformSql(tableDefineEntity.getTableName(), sql);
		if(map!=null && map.get("version").toString().equals(version)){
			return true;
		}
		return false;
	}
	/**
	 * 扫描有几个子表需要插入
	 * @author cao.weiwei
	 * @date 2017年4月16日 上午9:51:06
	 * @param subTableData
	 * @return
	 */
	private List<String> scanInsertSubtable(TableDefineEntity tableDefineEntity,List<ColumnDefineEntity> list,
			Set<String > set,JSONObject jsonObj,String tableId){
		List<String> sqls = new ArrayList<String>();
		for(ColumnDefineEntity columnDefineEntity: list){
			if(set.contains(columnDefineEntity.getColumnName())){
				String subtableName = tableDefineEntity.getTableName()+SysSqlConstant._ZB_+columnDefineEntity.getColumnName();
				String subtabledata =  jsonObj.getString(columnDefineEntity.getColumnName());
				List<Map<String,Object>> columns = dymcformQueryService.queryTableType(subtableName);
				if(!StringUtils.isEmpty(subtabledata)){
					List<Map> rows = JSON.parseArray(subtabledata,Map.class);
					sqls.addAll(concatSubTableInsertSql(subtableName,rows,columns,tableId));
				}
			}
		}
		return sqls;
	}
	/**
	 * 全插入子表数据
	 * @author cao.weiwei
	 * @date 2017年4月14日 下午6:39:16
	 * @param tableName
	 * @param crudSql
	 * @param rows
	 * @param columns
	 * @param tableId
	 */
	private List<String> concatSubTableInsertSql(String tableName,  List<Map> tableData,
			List<Map<String, Object>> columns,String tableId) {
		 List<String> sqls = new ArrayList<String>();
		for(Map<String,Object> row: tableData){
			row.put(SysSqlConstant.MAIN_TABLE_ID, tableId);
			sqls.add(concatSubTableRowInsertSql(tableName, columns,row));
		}
		return sqls;
	}
	
	/**
	 * 扫描更新表数据时候,有各个记录的插入删除sql
	 * @author cao.weiwei
	 * @date 2017年4月14日 下午6:39:32
	 * @return
	 */
	private List<String> scanUpdateSubtable(TableDefineEntity tableDefineEntity,List<ColumnDefineEntity> list,
			Set<String > set,JSONObject jsonObj,String tableId) {
		List<String> sqls = new ArrayList<String>();
		for(ColumnDefineEntity columnDefineEntity: list){
			if(set.contains(columnDefineEntity.getColumnName())){
				String subtableName = tableDefineEntity.getTableName()+SysSqlConstant._ZB_+columnDefineEntity.getColumnName();
				String subtabledata =  jsonObj.getString(columnDefineEntity.getColumnName());
				List<Map<String,Object>> columns = dymcformQueryService.queryTableType(subtableName);
				if(!StringUtils.isEmpty(subtabledata)){
					List<Map> rows = JSON.parseArray(subtabledata,Map.class);
					sqls.addAll(concatSubTableUpdateSql(subtableName,rows,columns,tableId));
				}
			}
		}
		return sqls;
	}
	
	/**
	 * 组装更新子表记录的sql语句
	 * @author cao.weiwei
	 * @date 2017年4月16日 上午10:15:26
	 * @param subtableName
	 * @param sb
	 * @param tableData
	 * @param columns
	 * @return
	 */
	private List<String> concatSubTableUpdateSql(String subtableName,
			List<Map> tableData,List<Map<String,Object>>columns,String tableId){
		List<String> sqls = new ArrayList<String>();
		for(Map<String,Object> row: tableData){
			row.put(SysSqlConstant.MAIN_TABLE_ID, tableId);
			String state = null;
			if(isNotEmpty(row.get("_state"))) state = row.get("_state").toString();
			
			if("added".equals(state)){
				sqls.add(concatSubTableRowInsertSql(subtableName, columns,row));
			}else if( "modified".equals(state)){
				sqls.add(concatSubTableRowUpdateSql(subtableName, columns,row));
			}else if("removed".equals(state)){
				sqls.add(concatSubTableRowDeleteSql(subtableName, columns,row));
			}
			
		}
		return sqls;
	}
	/**
	 * 判断对象不为空
	 * @author cao.weiwei
	 * @date 2017年4月23日 上午10:34:49
	 * @param o
	 * @return
	 */
	private boolean isNotEmpty(Object o){
		if(o == null) return false;
		return true;
	}
	/**
	 * 子表插入一行数据SQL语句
	 * @author cao.weiwei
	 * @date 2017年4月16日 上午10:26:23
	 * @param tableName
	 * @param crudSql
	 * @param columns
	 * @param row
	 */
	private String concatSubTableRowInsertSql(String tableName, 
			List<Map<String, Object>> columns,Map<String,Object> row) {
		StringBuffer crudSql = new StringBuffer();
		crudSql.append(SysSqlConstant.INSERTINTO).append(tableName);
		crudSql.append(SysSqlConstant.LEFT_BRACKETS);
		for(Map<String,Object> colum:columns){
			if(!isDefaultField(colum.get("columnName").toString()))
				crudSql.append(colum.get("columnName").toString()).append(SysSqlConstant.COMMA);
		}
		crudSql.append(SysSqlConstant.CREATE_TIME).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.CREATE_USER).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.UPDATE_TIME).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.UPDATE_USER).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.VERSION).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.IS_DEL).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.ID)
		.append(SysSqlConstant.RIGHT_BRACKETS).append(SysSqlConstant.VALUES_STR)
		.append(SysSqlConstant.LEFT_BRACKETS);
		String version = UUID.randomUUID().toString(); //版本
		String id = UUID.randomUUID().toString();// id
		for(Map<String,Object> colum:columns){
			String keyname = colum.get("columnName").toString();
			String value = "";
			if(row.get(keyname)!=null) value = row.get(keyname).toString();
			if(!isDefaultField(colum.get("columnName").toString()))
				crudSql.append(SysSqlConstant.QUOTES).append(value).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA);
		}
		crudSql.append(SysSqlConstant.QUOTES).append(DateUtils.getCurrentTime()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.QUOTES).append(SysSqlConstant.CREATE_USER).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.QUOTES).append(DateUtils.getCurrentTime()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.QUOTES).append(SysSqlConstant.UPDATE_USER).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)//版本
		.append(SysSqlConstant.QUOTES).append(version).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)//id
		.append(SysSqlConstant.QUOTES).append(SysConstant.ZERO_STRING).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)//isDel
		.append(SysSqlConstant.QUOTES).append(id).append(SysSqlConstant.QUOTES).append(SysSqlConstant.RIGHT_BRACKETS);
		return crudSql.toString();
	}
	
	/**
	 * 子表更新一条记录sql语句
	 * @author cao.weiwei
	 * @date 2017年4月16日 上午10:26:05
	 * @param tableName
	 * @param crudSql
	 * @param columns
	 * @param row
	 */
	private String concatSubTableRowUpdateSql(String tableName, 
			List<Map<String, Object>> columns,Map<String,Object> row){
		StringBuffer crudSql = new StringBuffer();
		crudSql.append(SysSqlConstant.UPDATE).append(tableName).append(SysSqlConstant.SET);
		for(Map colum:columns){
			if(!isDefaultField(colum.get("columnName").toString())){
				Object columnValue = row.get(colum.get("columnName").toString());
				String value="";
				if(isNotEmpty(columnValue)) value = columnValue.toString();
				crudSql.append(colum.get("columnName")).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(value).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA);
			}
		}
		 crudSql.append(SysSqlConstant.UPDATE_USER).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(((IPlatformUser)UserContext.getUser()).getUserNo()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.UPDATE_TIME).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(DateUtils.getCurrentTime()).append(SysSqlConstant.QUOTES)
		.append(SysSqlConstant.WHERE)
		.append(SysSqlConstant.ID).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(row.get(SysSqlConstant.ID.trim())).append(SysSqlConstant.QUOTES);
		 return crudSql.toString();
	}
	/**
	 * 子表删除一行数据sql语句
	 * @author cao.weiwei
	 * @date 2017年4月16日 上午10:25:46
	 * @param tableName
	 * @param crudSql
	 * @param columns
	 * @param row
	 */
	private String concatSubTableRowDeleteSql(String tableName, 
			List<Map<String, Object>> columns,Map<String,Object> row){
		StringBuffer crudSql = new StringBuffer();
		crudSql.append(SysSqlConstant.UPDATE).append(tableName).append(SysSqlConstant.SET);
		crudSql.append(SysSqlConstant.IS_DEL).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(SysConstant.SUCCESS).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA);
		crudSql.append(SysSqlConstant.UPDATE_USER).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(((IPlatformUser)UserContext.getUser()).getUserNo()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.UPDATE_TIME).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(DateUtils.getCurrentTime()).append(SysSqlConstant.QUOTES)
		.append(SysSqlConstant.WHERE)
		.append(SysSqlConstant.ID).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(row.get(SysSqlConstant.ID.trim())).append(SysSqlConstant.QUOTES);
		return crudSql.toString();
	}
	
	/**
	 * 判断是否是默认字段
	 * @author cao.weiwei
	 * @date 2017年4月16日 下午1:18:48
	 * @param columnName
	 * @return
	 */
	private boolean  isDefaultField(String columnName){
		boolean flag = false;
		if((SysSqlConstant.CREATE_TIME.trim()).equalsIgnoreCase(columnName)){
			flag = true;
		}else if((SysSqlConstant.CREATE_USER.trim()).equalsIgnoreCase(columnName)){
			flag = true;
		}else if((SysSqlConstant.UPDATE_USER.trim()).equalsIgnoreCase(columnName)){
			flag = true;
		}else if((SysSqlConstant.UPDATE_TIME.trim()).equalsIgnoreCase(columnName)){
			flag = true;
		}else if((SysSqlConstant.IS_DEL.trim()).equalsIgnoreCase(columnName)){
			flag = true;
		}else if((SysSqlConstant.VERSION.trim()).equalsIgnoreCase(columnName)){
			flag = true;
		}else if((SysSqlConstant.ID.trim()).equalsIgnoreCase(columnName)){
			flag = true;
		}
		return flag;
	}
	
	/**
	 * 拼接updateSql
	 * @author shensu
	 * @date 2017年4月5日 下午1:02:48
	 * @param tableDefineEntity
	 * @param list
	 * @param crudSql
	 * @param jsonObj
	 * @param id
	 */
	private void concateUpdateSql(TableDefineEntity tableDefineEntity,List<ColumnDefineEntity> list,StringBuffer crudSql,JSONObject jsonObj, String id,Map<String,Object> result) {
		crudSql.append(SysSqlConstant.UPDATE).append(tableDefineEntity.getTableName()).append(SysSqlConstant.SET);
		String version = UUID.randomUUID().toString(); //版本
		for(ColumnDefineEntity columnDefineEntity:list){
			if(StringUtils.isNotBlank(jsonObj.getString(columnDefineEntity.getColumnName()))
					&& !SysConstant.SUCCESS.equals(columnDefineEntity.getIsList())){//排除子表控件数据更新
				crudSql.append(columnDefineEntity.getColumnName()).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(CodeFilter.toHtml(jsonObj.getString(columnDefineEntity.getColumnName()))).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA);
			}
		}
		 crudSql.append(SysSqlConstant.UPDATE_USER).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(((IPlatformUser)UserContext.getUser()).getUserNo()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.VERSION).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(version).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.UPDATE_TIME).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(DateUtils.getCurrentTime()).append(SysSqlConstant.QUOTES)
		.append(SysSqlConstant.WHERE)
		.append(SysSqlConstant.ID).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(id).append(SysSqlConstant.QUOTES);
		 result.put("version", version);
	}
	/**
	 * 拼接动态表单插入语句
	 * @author shensu
	 * @date 2017年4月5日 上午11:54:36
	 * @param tableDefineEntity
	 * @param list
	 * @param crudSql
	 * @param jsonObj
	 */
	private void concateInsertSql(TableDefineEntity tableDefineEntity,List<ColumnDefineEntity> list, StringBuffer crudSql,JSONObject jsonObj,Map<String,Object> result) {
		crudSql.append(SysSqlConstant.INSERTINTO).append(tableDefineEntity.getTableName());
		crudSql.append(SysSqlConstant.LEFT_BRACKETS);
		for(ColumnDefineEntity columnDefineEntity:list){
			crudSql.append(columnDefineEntity.getColumnName()).append(SysSqlConstant.COMMA);
		}
		crudSql.append(SysSqlConstant.CREATE_TIME).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.CREATE_USER).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.UPDATE_TIME).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.UPDATE_USER).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.VERSION).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.ID)
		.append(SysSqlConstant.RIGHT_BRACKETS).append(SysSqlConstant.VALUES_STR)
		.append(SysSqlConstant.LEFT_BRACKETS);
		for(ColumnDefineEntity columnDefineEntity:list){
			if(!SysConstant.SUCCESS.equals(columnDefineEntity.getIsList())){
				crudSql.append(SysSqlConstant.QUOTES).append(CodeFilter.toHtml(jsonObj.getString(columnDefineEntity.getColumnName()))).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA);
			}else {
				crudSql.append(SysSqlConstant.QUOTES).append("").append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA);
			}
		}
		String version = UUID.randomUUID().toString(); //版本
		String id = UUID.randomUUID().toString();// id
		crudSql.append(SysSqlConstant.QUOTES).append(DateUtils.getCurrentTime()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.QUOTES).append(((IPlatformUser)UserContext.getUser()).getUserNo()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.QUOTES).append(DateUtils.getCurrentTime()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)
		.append(SysSqlConstant.QUOTES).append(((IPlatformUser)UserContext.getUser()).getUserNo()).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)//版本
		.append(SysSqlConstant.QUOTES).append(version).append(SysSqlConstant.QUOTES).append(SysSqlConstant.COMMA)//id
		.append(SysSqlConstant.QUOTES).append(id).append(SysSqlConstant.QUOTES).append(SysSqlConstant.RIGHT_BRACKETS);
		result.put("id", id);
		result.put("version", version);
	}
	/** 
	 * 
	 * @author shensu
	 * @date 2017年4月6日 上午10:15:22
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#getFormData(java.lang.String, java.lang.String, java.lang.String)
	 * @param tableName
	 * @param pkvalue
	 * @param dymcformId
	 * @return
	 */
	public String getFormData(String tableName, String pkvalue,String dymcformId,HttpServletRequest request) {
		ResponseEntity res = new ResponseEntity(SysConstant.SUCCESS,"操作成功");
		String projectName = request.getSession().getAttribute("projectName").toString();
		Map<String, Object> resMap= new HashMap<String, Object>();
		tableName = checkTableName(tableName, dymcformId);
		String sql = concateSelectFormData(dymcformId,tableName,pkvalue);
		Map map= dymcformQueryService.queryDymcformSql(tableName, sql);
		if(map==null) {
			res.setStatus(SysConstant.FAIL);
			res.setMessage("未查到表单数据");
		}else{
			setDefaultValue(tableName, dymcformId, map,projectName,pkvalue);
			String retStr =JSON.toJSONString(map);
			resMap.put("result", CodeFilter.unHtml(retStr));
			res.setResult(resMap);
		}
		return JSON.toJSONString(res);
	}

	/**
	 * 判断是否有表名
	 * @author cao.weiwei
	 * @date 2017年4月28日 上午10:49:14
	 * @param tableName
	 * @param dymcformId
	 * @return
	 */
	private String checkTableName(String tableName, String dymcformId) {
		if(StringUtils.isEmpty(tableName)){
			TableDefineEntity tableDefine = new TableDefineEntity();
			tableDefine.setDymcformId(dymcformId);
			tableDefine = tableDefineQueryService.queryByEntity(tableDefine);
			if(tableDefine==null){
				throw new BusinessException("0","未查到表单TableDefineEntity,请检查dymcformId是否正确");
			}
			tableName  = tableDefine.getTableName();
		}
		return tableName;
	}
	/**
	 * 查询是否ID选择器,进行赋值
	 * @author cao.weiwei
	 * @date 2017年4月21日 上午10:45:51
	 * @param tableName
	 * @param dymcformId
	 * @param map 主表结果集
	 * @param projectName 项目名
	 * @param pkValue 主表主键
	 */
	private void setDefaultValue(String tableName, String dymcformId, Map map,String projectName,
			String pkValue) {
		TableDefineEntity tableDefineEntity = new TableDefineEntity();
		tableDefineEntity.setTableName(tableName);
		tableDefineEntity.setDymcformId(dymcformId);
		tableDefineEntity = tableDefineQueryService.queryByEntity(tableDefineEntity);
		String htmlCode =tableDefineEntity.getHtmlCode();
		Document doc = Jsoup.parse(htmlCode);
		Elements els = doc.getElementsByAttribute(TableDefineConstant.PLUGINS.trim());
		for(Element e: els){
			String field = e.attr("columnname");// columnName 与name一致
			if(TableDefineConstant.CONTROL_IDSELECT.trim().equals(e.attr(TableDefineConstant.PLUGINS.trim()))){
				if(map.get(field)==null || StringUtils.isEmpty(map.get(field).toString())){
					IdWorker idWorker = new IdWorker(0,0);
					String prefix =e.attr("prefix");
					map.put(field, prefix+idWorker.nextId());
				}
			}
		}
		
		Map<String,Object> map1 = map;
		
		for(Map.Entry<String,Object> entry: map1.entrySet()){
			if("create_time".equals(entry.getKey())){
				if(entry.getValue() instanceof java.sql.Timestamp){
					map.put(entry.getKey(), DateUtils.format((java.sql.Timestamp)entry.getValue(), "yyyy-MM-dd HH:mm:ss"));
				}
			}
		}
	}
	/**
	 * 验证是否是同一种设置页面值的选择器
	 * TODO（方法详细描述说明、方法参数的具体涵义）
	 * @author cao.weiwei
	 * @date 2017年4月21日 下午9:15:45
	 * @param e
	 * @return
	 */
	private boolean checkSelectContro(Element e){
		if(TableDefineConstant.CONTROL_PEOPLESELECT.equals(e.attr(TableDefineConstant.PLUGINS))){
			return true;
		}else if(TableDefineConstant.CONTROL_DEPTSELECT.equals(e.attr(TableDefineConstant.PLUGINS))){
			return true;
		}
		return false;
	}
	/**
	 * 生成查询动态表单方法
	 * @author shensu
	 * @date 2017年4月6日 上午11:25:54
	 * @param dymcformId
	 * @return
	 */
	private String concateSelectFormData(String dymcformId,String tableName,String pkvalue) {
		StringBuffer sql = new StringBuffer();
		List<ColumnDefineEntity> list = queryExistcolumnDefine(dymcformId);
		sql.append(SysSqlConstant.SELECT);
		for(ColumnDefineEntity columnDefineEntity:list){
			sql.append(columnDefineEntity.getColumnName()).append(SysSqlConstant.COMMA);
		}
		sql.append(SysSqlConstant.ID.toLowerCase()).append(SysSqlConstant.COMMA)
		   .append(SysSqlConstant.UPDATE_TIME.toLowerCase()).append(SysSqlConstant.COMMA)
		   .append(SysSqlConstant.UPDATE_USER.toLowerCase()).append(SysSqlConstant.COMMA)
		   .append(SysSqlConstant.CREATE_TIME.toLowerCase()).append(SysSqlConstant.COMMA)
		   .append(SysSqlConstant.CREATE_USER.toLowerCase()).append(SysSqlConstant.COMMA)
		   .append(SysSqlConstant.VERSION.toLowerCase())
		   .append(SysSqlConstant.FROM).append(tableName)
		   .append(SysSqlConstant.WHERE).append(SysSqlConstant.ID).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(pkvalue).append(SysSqlConstant.QUOTES);
		return sql.toString();
	}
	/**
	 * 查询未被删除的列
	 * @author shensu
	 * @date 2017年4月6日 上午11:32:28
	 * @param dymcformId
	 * @return
	 */
	private List<ColumnDefineEntity> queryExistcolumnDefine(String dymcformId) {
		ColumnDefineEntity columnDefineEntity = new ColumnDefineEntity();
		columnDefineEntity.setDymcformId(dymcformId);
		columnDefineEntity.setIsDel(SysConstant.FAIL);
		return columnDefineQueryService.queryAllColumnDefine(columnDefineEntity);
	}
	/**
	 * 
	 * 
	 * @author cao.weiwei
	 * @date 2017年4月16日 下午3:36:59
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#getSubTableData(java.lang.String, java.lang.String)
	 * @param tableName
	 * @param mainTableId
	 * @return
	 */
	public String getSubTableData(String tableName,String pkvalue, String mainTableId) {
		List<Map<String, Object>>  list  = new ArrayList<Map<String, Object>>();
		if(StringUtils.isNotEmpty(tableName) &&StringUtils.isNotEmpty(mainTableId) ){
			list = dymcformQueryService.querySubTableList(tableName,pkvalue, mainTableId);
		}
		return new PageResult(list,0L).toString();
	}
	
	/**
	 * 
	 * 
	 * @author cao.weiwei
	 * @date 2017年4月18日 下午5:38:50
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#getFlowData(com.jodinfo.outmirror.api.tabledefine.entity.TableDefineEntity)
	 * @param tableDefineEntity
	 * @return
	 */
	public ResponseEntity getFlowData(TableDefineEntity tableDefineEntity) {
		ResponseEntity rs = new ResponseEntity(SysConstant.SUCCESS,"操作成功");
		try{
//			checkPar(tableDefineEntity);
//			String htmlValue = tableDefineEntity.getHtmlValue();
//			tableDefineEntity = tableDefineQueryService.queryByEntity(tableDefineEntity);
//			Document doc  =Jsoup.parse(tableDefineEntity.getHtmlCode());
//			Elements els = doc.getElementsByAttribute("isflowvar");
//			Map<String,String> dataMap = JSON.parseObject(htmlValue,Map.class);
//			Map<String,Object> data = new HashMap<String,Object>();
//			getFlowData(tableDefineEntity, els, dataMap, data);
		}catch(Exception e){
			logger.error(com.hero.core.util.StringUtils.toString(e));
			rs.setMessage(com.hero.core.util.StringUtils.toString(e)).setStatus(SysConstant.FAIL);
		}
		return rs;
	}
	/**
	 * 获取流程变量数据
	 * @author cao.weiwei
	 * @date 2017年4月18日 下午5:55:43
	 * @param tableDefineEntity
	 * @param els 节点
	 * @param dataMap 源数据
	 * @param data 结果集
	 */
	private void getFlowData(TableDefineEntity tableDefineEntity, Elements els,
			Map<String, String> dataMap, Map<String, Object> data) {
		for(Element e: els){
			// 判断是否必填
			String isflowvar = e.attr("isflowvar");
			String islist = e.attr("islist");
			String name = e.attr("name");
			if(SysConstant.SUCCESS.equals(isflowvar) && SysConstant.SUCCESS.equals(islist)){
				buildsubtableData(tableDefineEntity, dataMap, data, name);
			}else if(SysConstant.SUCCESS.equals(isflowvar) && !SysConstant.SUCCESS.equals(islist)){
				if(StringUtils.isEmpty(dataMap.get(name))){
					data.put(name, dataMap.get(name));
				}
			}
		}
	}
	/**
	 * 组建子表数据
	 * @author cao.weiwei
	 * @date 2017年4月18日 下午6:03:58
	 * @param tableDefineEntity
	 * @param dataMap
	 * @param data
	 * @param name
	 */
	private void buildsubtableData(TableDefineEntity tableDefineEntity,
			Map<String, String> dataMap, Map<String, Object> data,
			String name) {
		Base64 base = new Base64();
		String subTableList = new String(base.decodeFast(dataMap.get(TableDefineConstant.SUBTABLELIST.trim())));
		List<SubtableDTO> list = JSONArray.parseArray(subTableList,SubtableDTO.class);
		for(SubtableDTO subtable: list){
			String subname = subtable.getSubTableName();
			if((tableDefineEntity.getTableName()+"_zb_"+name).equals(subname)){
				data.put(name, subtable.getData());
			}
		}
	}
	/**
	 * 验证参数
	 * @author cao.weiwei
	 * @date 2017年4月18日 下午5:54:00
	 * @param tableDefineEntity
	 */
	private void checkPar(TableDefineEntity tableDefineEntity) {
		if(tableDefineEntity==null ){
			throw new BusinessException("0", "参数不能为空");
		}else if(StringUtils.isEmpty(tableDefineEntity.getTableName())){
			throw new BusinessException("0", "tableNam不能为空");
		}else if(StringUtils.isEmpty(tableDefineEntity.getHtmlValue())){
			throw new BusinessException("0", "htmlValue不能为空");
		}
	}

	public String getFormDataIntface(String tableName, String pkvalue,
			String dymcformId, HttpServletRequest request) {
		TableDefineEntity tableDefineEntity = new TableDefineEntity();
		tableDefineEntity.setDymcformId(dymcformId);
		
		String subtablePar =  request.getParameter("subtablePar");
		return dymcformQueryService.queryFormdataWithSubtableHandle(tableDefineEntity, pkvalue, "",subtablePar) ;
	}

	/**
	 * 
	 * 
	 * @author cao.weiwei
	 * @date 2017年5月9日 上午10:10:39
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#getDymcformMessageList(java.lang.String)
	 * @param dymcformList
	 * @return
	 */
	public ResponseEntity getDymcformMessageList(String dymcformList) {
		ResponseEntity rs = new ResponseEntity(SysConstant.SUCCESS,"操作成功");
		try{
			if(StringUtils.isEmpty(dymcformList)) throw new BusinessException("0","参数为空");	
			JSONArray jsonArray = JSONArray.parseArray(dymcformList);
			List<Map> list = new ArrayList<Map>();
			for(Object item: jsonArray){
				JSONObject dymcform = (JSONObject) item ;
				String tableName = dymcform.getString("tableName");
				String dymcformId = dymcform.getString("dymcformId");
				String pkvalue = dymcform.getString("pkvalue");
				String[] fieldArr  = dymcform.getString("fields").split(",");
				tableName = checkTableName(tableName, dymcformId);
				String sql = concateSelectFieldData(dymcformId,tableName,pkvalue,fieldArr);
				Map map= dymcformQueryService.queryDymcformSql(tableName, sql);
				buildSubtableData(tableName, dymcformId, pkvalue, fieldArr, map);
				list.add(map);
			}
			Map<String,Object> result = new HashMap<String,Object>();
			result.put("result", list);
			rs.setResult(result);
		}catch(Exception e){
			rs.setMessage(e.getMessage()).setStatus(SysConstant.FAIL);
		}
		return rs;
	}

	/**
	 * 组建子表数据
	 * @author cao.weiwei
	 * @date 2017年5月9日 上午10:51:03
	 * @param tableName
	 * @param dymcformId
	 * @param pkvalue
	 * @param fieldArr
	 * @param map
	 */
	private void buildSubtableData(String tableName, String dymcformId, String pkvalue,
			String[] fieldArr, Map map) {
		ColumnDefineEntity columnDefineEntity = new ColumnDefineEntity();
		columnDefineEntity.setDymcformId(dymcformId);
		List<ColumnDefineEntity> ColumnDefineEntityList = columnDefineQueryService.queryAllColumnDefine(columnDefineEntity);
		for(String field: fieldArr){
			for(ColumnDefineEntity column:  ColumnDefineEntityList){
				if(column.getColumnName().equals(field) && column.getIsList().equals(SysConstant.SUCCESS)){
					map.put(field, dymcformQueryService.querySubTableData(pkvalue, tableName, column));
				}
			}
		}
	}

	/**
	 * 查询表单部分字段
	 * @author cao.weiwei
	 * @date 2017年5月9日 上午10:26:45
	 * @param dymcformId
	 * @param tableName
	 * @param pkvalue
	 * @return
	 */
	private String concateSelectFieldData(String dymcformId,String tableName,String pkvalue,String[] fields) {
		StringBuffer sql = new StringBuffer();
		List<ColumnDefineEntity> list = queryExistcolumnDefine(dymcformId);
		sql.append(SysSqlConstant.SELECT);
		for(String  field: fields){
			sql.append(field).append(SysSqlConstant.COMMA);
		}
		sql.append(SysSqlConstant.ID.toLowerCase()).append(SysSqlConstant.BLANK);
	    sql.append(SysSqlConstant.FROM).append(tableName)
	   .append(SysSqlConstant.WHERE).append(SysSqlConstant.ID).append(SysSqlConstant.EQUAL_SYMBOL).append(SysSqlConstant.QUOTES).append(pkvalue).append(SysSqlConstant.QUOTES);
		return sql.toString();
	}

	/**
	 * 
	 * 
	 * @author cao.weiwei
	 * @date 2017年5月10日 下午5:04:28
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#generateFormData(com.jodinfo.outmirror.api.tabledefine.entity.TableDefineEntity)
	 * @param tableDefineEntity
	 * @return
	 */
	public ResponseEntity generateFormData(
			TableDefineEntity tableDefineEntity) {

		String htmlValue = tableDefineEntity.getHtmlValue();
		JSONObject json = JSONObject.parseObject(htmlValue);
		TableDefineEntity querytableDefine = tableDefineQueryService.queryByEntity(tableDefineEntity);
		buildControlValue(json, querytableDefine);
		tableDefineEntity.setHtmlValue(JSON.toJSONString(json));
		return saveFormData(tableDefineEntity);
	}

	/**
	 * 
	 * 获取表单自动填入的值
	 * @author cao.weiwei
	 * @date 2017年5月10日 下午5:31:13
	 * @param json
	 * @param querytableDefine
	 */
	private void buildControlValue(JSONObject json,
			TableDefineEntity querytableDefine) {
		String htmlCode = querytableDefine.getHtmlCode();
		Document doc = Jsoup.parse(htmlCode);
		Elements els = doc.getElementsByAttributeValue("plugins", "idselect");
		if(els!=null && els.size()>0){
			for(Element e: els){
				if(StringUtils.isEmpty(json.getString(e.attr("name")))){
					json.put(e.attr("name"), getIdselectValue(e));
				}
			}
		}
	}
	
	/**
	 * 获取id选择器的值
	 * @author cao.weiwei
	 * @date 2017年5月10日 下午5:23:21
	 * @param e
	 * @return
	 */
	private String getIdselectValue(Element e){
    	IdWorker idWorker = new IdWorker(0,0);
    	String prefix = e.attr(TableDefineConstant.PREFIX.trim());
    	return prefix+idWorker.nextId();
    }

	/**
	 * 
	 * 
	 * @author cao.weiwei
	 * @date 2017年5月13日 下午7:34:07
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#queryDymcformSql(java.lang.String, java.lang.String)
	 * @param tableName
	 * @param sql
	 * @return
	 */
	public Map  queryDymcformSql(String tableName, String sql) {
		return dymcformQueryService.queryDymcformSql(tableName,sql);
	}
	
	/**
	 * 
	 * 
	 * @author cao.weiwei
	 * @date 2017年5月13日 下午7:38:42
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#batchExecuteSqls(java.util.List)
	 * @param sqls
	 */
	public void  batchExecuteSqls(List<String> sqls) {
		 dymcformDmlService.batchExecuteSqls(sqls);
	}

	/**
	 * 
	 * 
	 * @author cao.weiwei
	 * @date 2017年5月15日 下午1:49:24
	 * @see com.jodinfo.outmirror.api.tabledefine.service.DymcformBizService#getPurchaseEquipmentList(java.lang.String)
	 * @param business_no
	 * @param EQ_TYPE_ID
	 * @return
	 */
	public String getPurchaseEquipmentList(String business_no,String equipmentType) {
		Map<String,Object> map = dymcformQueryService.queryDymcformSql("t_purchase", queryPurchaseRecordSql(business_no));
		if(map == null){
			return new PageResult(new ArrayList(),0L).toString();
		}else{
			String mainTableId = map.get("id").toString();
			List<Map<String, Object>>  list = dymcformQueryService.queryList(queryPurchaseSubtableRecordSql(mainTableId,equipmentType));
			Map<String,Object> countMap =	dymcformQueryService.queryDymcformSql("t_purchase", queryPurchaseSubtableCountSql(mainTableId,equipmentType));
			Long count = Long.parseLong(countMap.get("count").toString());
			return new PageResult(list,count).toString();
		}
	}
	/**
	 * 查询采购单的主表数据
	 * @author cao.weiwei
	 * @date 2017年5月15日 下午2:34:55
	 * @param business_no
	 * @return
	 */
	private String queryPurchaseRecordSql(String business_no){
		return "select id from t_purchase where wo_no = '"+business_no+"'";
	}
	/**
	 * 查询采购单子表数据sql
	 * @author cao.weiwei
	 * @date 2017年5月15日 下午2:35:44
	 * @param business_no
	 * @return
	 */
	private String queryPurchaseSubtableRecordSql(String mainTableId,String equipmentType){
		String sql = "select * from t_purchase_zb_equipment_list where IS_DEL='0' and MAIN_TABLE_ID = '"+mainTableId+"'";
		if(!StringUtils.isEmpty(equipmentType)){
			sql += " and EQ_TYPE_ID='"+equipmentType +"'";
		}
		return sql;
	}
	/**
	 * 查询采购单子表记录数sql
	 * @author cao.weiwei
	 * @date 2017年5月15日 下午2:53:51
	 * @param mainTableId
	 * @param equipmentType
	 * @return
	 */
	private String queryPurchaseSubtableCountSql(String mainTableId,String equipmentType){
		String sql = "select count(0) as count from t_purchase_zb_equipment_list where IS_DEL='0' and MAIN_TABLE_ID = '"+mainTableId+"'";
		if(!StringUtils.isEmpty(equipmentType)){
			sql += " and EQ_TYPE_ID='"+equipmentType +"'";
		}
		return sql;
	}

	public String getWoNo(String prefix) {
		IdWorker idWorker = new IdWorker(0,0);
		return prefix+idWorker.nextId();
	}
	
}
